home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
EXPRO
/
_files
/
_exprodir
/
exproasm._s
< prev
next >
Wrap
Text File
|
1990-06-05
|
10KB
|
433 lines
; by Ferdinand Oeinck copyright 1990
;
; version 1.00, 04-06-1990
;
; file: exproasm.s
;
;
;
a1 RN 0
a2 RN 1
a3 RN 2
a4 RN 3
v1 RN 4
v2 RN 5
v3 RN 6
v4 RN 7
v5 RN 8
v6 RN 9
sl RN 10
fp RN 11
ip RN 12
sp RN 13
lr RN 14
pc RN 15
f0 FN 0
f1 FN 1
f2 FN 2
f3 FN 3
f4 FN 4
f5 FN 5
f6 FN 6
f7 FN 7
r0 RN 0
r1 RN 1
r2 RN 2
r3 RN 3
r4 RN 4
r5 RN 5
r6 RN 6
r7 RN 7
r8 RN 8
r9 RN 9
r10 RN 10
r11 RN 11
r12 RN 12
r13 RN 13
r14 RN 14
r15 RN 15
R0 RN 0
R1 RN 1
R2 RN 2
R3 RN 3
R4 RN 4
R5 RN 5
R6 RN 6
R7 RN 7
R8 RN 8
R9 RN 9
R10 RN 10
R11 RN 11
R12 RN 12
R13 RN 13
R14 RN 14
PC RN 15
GET $.clib.s.swis
OS_check_address * &38006CC
OS_check_cont * &E58CD108
AREA |C$$code|, CODE, READONLY
;****************************************************************
;* *
;* FUNCTION TO CLAIM THE INTERRUPT AND INTERUPT HANDLER *
;* *
;****************************************************************
exproasm_ClaimIntDeviceVector_X
DCB "exproasm_ClaimIntDeviceVector", 0
ALIGN
exproasm_ClaimIntDeviceVector_Y
DCD &ff000000 + exproasm_ClaimIntDeviceVector_Y - exproasm_ClaimIntDeviceVector_X
EXPORT exproasm_ClaimIntDeviceVector
exproasm_ClaimIntDeviceVector
;void exproasm_ClaimIntDeviceVector(int *adr, int *cnt, int count);
LDR a1, expro_check
LDR a2, expro_check + 4
LDR a1, [a1]
CMP a1, a2 ; check if running under RISCOS 2.00
MOVNE a1, #0
MOVNES pc, lr ; no
MOV a1, #0
LDR a3, [a1, #4] ; load undefined instr. vector
STR a3, default_undef_vector
BIC a3, a3, #&FF000000 ; clear branch bits
MOV a3, a3, LSL #2
ADD a3, a3, #12 ; address
STR a3, default_undef_instr ; save undefined instr. address
ADR a2, undefined_instr
SUB a2, a2, #12
MOV a2, a2, LSR #2
ORR a2, a2, #&EA000000
STR a2, [a1, #4] ; save my undefined instr. address
STR a2, my_undef_branch
MOV a1, #1 ; yes
ADR a2, exproasm_every
MOV a3, #0
SWI OS_CallEvery
MOV a1, #1
LDR a2, expro_claimed
STR a1, [a2]
MOVS pc, lr
expro_check
DCD OS_check_address
DCD OS_check_cont
default_undef_vector
DCD 0
my_undef_branch
DCD 0
expro_claimed
DCD |x$dataseg| + 4
EXPORT expro_fp_return_address
expro_fp_return_address
DCD 0
;****************************************************************
exproasm_ReleaseIntDeviceVector_X
DCB "exproasm_ReleaseIntDeviceVector", 0
ALIGN
exproasm_ReleaseIntDeviceVector_Y
DCD &ff000000+exproasm_ReleaseIntDeviceVector_Y-exproasm_ReleaseIntDeviceVector_X
EXPORT exproasm_ReleaseIntDeviceVector
exproasm_ReleaseIntDeviceVector ; void exproasm_ReleaseIntDeviceVector(void);
ADR a1, exproasm_every
MOV a2, #0
SWI OS_RemoveTickerEvent
LDR a1, default_undef_vector
MOV a2, #0
STR a1, [a2, #4] ; restore undefined inst. vector
MOV a1, #0
LDR a2, expro_claimed
STR a1, [a2]
MOVS pc, lr
;****************************************************************
exproasm_every_X
DCB "exproasm_every", 0
ALIGN
exproasm_every_Y
DCD &ff000000 + exproasm_every_Y - exproasm_every_X
IMPORT binsearch
exproasm_every
STMFD sp!, {a1-a4, ip, lr}
MOV a1, #0
LDR a2, [a1, #264] ; OS stack storage
LDR a1, [a2, #28] ; 8 regs on stack => 7 * 4 = 28
BIC a1, a1, #&FC000003
BL binsearch
LDMFD sp!, {a1-a4, ip, pc}
undefined_instr
STMFD sp!, {a1}
BIC a1, lr, #&FC000003 ; return address
STR a1, expro_fp_return_address
LDMFD sp!, {a1}
LDR pc, default_undef_instr
default_undef_instr
DCD 0
;****************************************************************
;* *
;* FUNCTIONS TO GET THE RELEVANT LINKER AREAS TO C *
;* *
;****************************************************************
exproasm_getstart_X
DCB "exproasm_getstart", 0
ALIGN
exproasm_getstart_Y
DCD &ff000000 + exproasm_getstart_Y - exproasm_getstart_X
EXPORT exproasm_getstart
exproasm_getstart ; void exproasm_getstart(void);
ADR a1, exproasm_data
LDR a1, [a1, #0]
MOV pc, lr
;****************************************************************
exproasm_getend_X
DCB "exproasm_getend", 0
ALIGN
exproasm_getend_Y
DCD &ff000000 + exproasm_getend_Y - exproasm_getend_X
EXPORT exproasm_getend
exproasm_getend ; void exproasm_getend(void);
ADR a1, exproasm_data
LDR a1, [a1, #4]
MOV pc, lr
EXPORT exproasm_getlangdesblock
exproasm_getlangdesblock ; void exproasm_getlangdesblock(void);
ADR a1, exproasm_data
LDR a1, [a1, #8]
MOV pc, lr
IMPORT |C$$code$$Base|
IMPORT |C$$code$$Limit|
IMPORT |RTSK$$Data$$Base|
exproasm_data
DCD |C$$code$$Base|
DCD |C$$code$$Limit|
DCD |RTSK$$Data$$Base|
;****************************************************************
;* *
;* REDEFINITION OF wimp_poll AND wimp_pollidle *
;* *
;****************************************************************
EXPORT wimp_poll
IMPORT |_kernel_fpavailable|
wimp_poll
MOV R12,R13
STMDB R13!,{R4,R5,R11,R12,R14,PC}
SUB R11,R12,#4
MOV R5,R0
MOV R4,R1
LDR R0, fp_state_ptr
LDR R0,[R0],#0
CMP R0,#0
BLNE |_kernel_fpavailable|
CMPNE R0,#0
BLNE save_fpe_state
MOV R14,R0
LDR r0, expro_claimed
LDR r0, [r0]
CMP r0, #1
BNE poll_no_expro1
ADR r0, exproasm_every
MOV r1, #0
SWI OS_RemoveTickerEvent
LDR r0, default_undef_vector
MOV r1, #0
STR r0, [r1, #4]
poll_no_expro1
MOV R0,R5
ADD R1,R4,#4
SWI XOS_Bit:OR:Wimp_Poll
SUB R1,R1,#4
STR R0,[R1,#0]
MOVVC R0,#0
CMP R14,#0
BLNE restore_fpe_state
MOV r5, r0
LDR r0, expro_claimed
LDR r0, [r0]
CMP r0, #1
BNE poll_no_expro2
LDR a2, my_undef_branch
MOV a1, #0
STR a2, [a1, #4]
MOV a1, #1
ADR a2, exproasm_every
MOV a3, #0
SWI OS_CallEvery
poll_no_expro2
MOV r0, r5
LDMDB R11,{R4,R5,R11,R13,PC}^
EXPORT wimp_pollidle
IMPORT |_kernel_fpavailable|
wimp_pollidle
MOV R12,R13
STMDB R13!,{R4-R6,R11,R12,R14,PC}
SUB R11,R12,#4
MOV R5,R0
MOV R4,R1
MOV R6,R2
LDR R0, fp_state_ptr
LDR R0,[R0],#0
CMP R0,#0
BLNE |_kernel_fpavailable|
CMPNE R0,#0
BLNE save_fpe_state
MOV R14,R0
LDR r0, expro_claimed
LDR r0, [r0]
CMP r0, #1
BNE pollidle_no_expro1
ADR r0, exproasm_every
MOV r1, #0
SWI OS_RemoveTickerEvent
LDR r0, default_undef_vector
MOV r1, #0
STR r0, [r1, #4]
pollidle_no_expro1
MOV R0,R5
ADD R1,R4,#4
MOV R2,R6
SWI XOS_Bit:OR:Wimp_PollIdle
CMP R14,#0
BLNE restore_fpe_state
SUB R1,R1,#4
STR R0,[R1,#0]
MOVVC R0,#0
MOV r5, r0
LDR r0, expro_claimed
LDR r0, [r0]
CMP r0, #1
BNE pollidle_no_expro2
LDR a2, my_undef_branch
MOV a1, #0
STR a2, [a1, #4]
MOV a1, #1
ADR a2, exproasm_every
MOV a3, #0
SWI OS_CallEvery
pollidle_no_expro2
MOV r0, r5
LDMDB R11,{R4-R6,R11,R13,PC}^
save_fpe_state
RFS R1
STMDB R13!,{R1}
MOV R1,#0
WFS R1
SUB R13,R13,#&30
STFE f4,[R13,#0]
STFE f5,[R13,#12]
STFE f6,[R13,#24]
STFE f7,[R13,#36]
MOVS PC,R14
restore_fpe_state
MOV R4,#0
WFS R4
LDFE f4,[R13,#0]
LDFE f5,[R13,#12]
LDFE f6,[R13,#24]
LDFE f7,[R13,#36]
ADD R13,R13,#&30
LDMIA R13!,{R4}
WFS R4
MOVS PC,R14
EXPORT wimp_save_fp_state_on_poll
wimp_save_fp_state_on_poll
LDR R0, fp_state_ptr
MOV R1,#1
STR R1,[R0],#0
MOVS PC,R14
EXPORT wimp_corrupt_fp_state_on_poll
wimp_corrupt_fp_state_on_poll
LDR R0, fp_state_ptr
MOV R1,#0
STR R1,[R0],#0
MOVS PC,R14
fp_state_ptr
DCD |x$dataseg|
;****************************************************************
AREA |C$$data|
|x$dataseg|
DCD 0
DCD 0
END